package pl.edu.mimuw.mas.agent.behaviour.helicopter;

import jade.domain.DFService;
import jade.domain.FIPAException;
import jade.domain.FIPAAgentManagement.DFAgentDescription;
import jade.domain.FIPAAgentManagement.ServiceDescription;
import jade.lang.acl.ACLMessage;

import java.io.IOException;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import pl.edu.mimuw.mas.agent.HelicopterAgent;
import pl.edu.mimuw.mas.agent.HuntingAgent;
import pl.edu.mimuw.mas.agent.behaviour.MutableTimedBehaviour;
import pl.edu.mimuw.mas.message.PositionMessage;
import pl.edu.mimuw.mas.util.Time;

/**
 * Zachowanie rozsyłające pozycje agenta - używane podczas sledzenia łosia.
 */
public class BroadcastDeerPositionBehaviour extends MutableTimedBehaviour {
	private static final long serialVersionUID = -4133945773884625588L;
	protected final Logger logger = LoggerFactory.getLogger(getClass());

	public BroadcastDeerPositionBehaviour(HelicopterAgent agent) {
		super(agent, Time.HELICOPTER_BROADCAST);
	}

	@Override
	protected void onTick() {
		HelicopterAgent ha = (HelicopterAgent) myAgent;
		
		// szykuję wiadomość
		ACLMessage msg = new ACLMessage(ACLMessage.INFORM);
		try {
			msg.setContentObject(new PositionMessage(ha.getAID(), ha.getPosition().x, ha.getPosition().y));
			msg.setConversationId(HuntingAgent.DEER_POSITION_INFO_CONV);
		} catch (IOException e) {
			logger.error("{} : błąd podczas serializacji wiadomości", ha.getName(), e);
		}
		
		// szukam wszystkich agentów udostępniających usługę z czytaniem pozycji łosia
		DFAgentDescription template = new DFAgentDescription();
  		ServiceDescription sd = new ServiceDescription();
  		sd.setType(HuntingAgent.HUNTING_SERVICE_TYPE);
  		template.addServices(sd);
  		  		
		try {
			DFAgentDescription[] results = DFService.search(ha, template);
			for (int i = 0; i < results.length; i++) {
	  			msg.addReceiver(results[i].getName());
	  		}
		} catch (FIPAException e) {
			logger.error("{} : błąd FIPA", ha.getName(), e);
		}
		logger.debug("{} : wysyłam nową pozycję łosia", ha.getName());
		ha.send(msg);
	}
}
